<?php
/**
 * True Gallery Joomla Head Compressor
 *
 * @version 2.5
 * @author Alexey N. Brin (userxp@joomlaportal.ru)
 * @homepage http://truegallery.ru 
 * @filename compressor.php
 * @package True Gallery
 * @copyright (C) 2008-2009 by joomlatune.ru
 * @license GNU/GPL: http://www.gnu.org/copyleft/gpl.html
 * 
 * THIS GALLERY is an EVOLUTION of AkoGallery -> PonyGallery -> DatsoGallery
 *
 * If you fork this to create your own project, 
 * please make a reference to True Gallery someplace in your code 
 * and provide a link to http://www.joomlatune.ru
 *
 **/

defined('_VALID_MOS') or defined('_JEXEC') or die('Direct Access to this location is not allowed.');


// FUTURE PROTOTYPE
class JTuneHeadCompressor
{
	function &getInstance() {
		static $instance;
		if(!isset( $instance ) ) {
			$instance = new JTuneHeadCompressor();
		}
		return $instance;
	}
	
	function getHead() {
		if( class_exists( 'JFactory' ) ) {
			$document=& JFactory::getDocument();
			$head = $document->_custom;
		} else {
			$app = &JTuneConfig::getApplication();
			$head = $app->_head['custom'];
		}
		return $head;
	}
	
	function _() {
		$head = JTuneHeadCompressor::getHead();
		$code = implode( '', $head );
		
		$code = JTuneHeadCompressor::getJS( $code );
		//$code = implo( $code );
		//$code = htmlentities( $code );
		return $code;
	}
	
	function getJS( $string='' ) {
		$pt1 = "%<script[^>]*(src=\".*\")?>([^>]*)</script>%si";
		$pt2 = "%src=\"(.*?)\"%i";
		preg_match_all( $pt1, $string, $matches );
		foreach( $matches[0] as $key=>$m ) {
			if( ! @$matches[2][$key] ) {
				preg_match( $pt2, $m, $mt );
				if( count( $mt ) ) {
					$matches[2][$key] = $mt[1];
				}
				//xdump( $mt );
			}
			
			//xdump( $matches[2][$key] );
		}
		return $matches;
	}
	
	function getCSS( $string='' ) {
		
	}
}
?>


<?php

/************************************************************************
 * CSS and Javascript Combinator 0.5
 * Copyright 2006 by Niels Leenheer
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */


$cache 	  = true;
$cachedir = dirname(__FILE__) . '/cache';
$cssdir   = dirname(__FILE__) . '/css';
$jsdir    = dirname(__FILE__) . '/javascript';

// Determine the directory and type we should use
switch ($_GET['type']) {
	case 'css':
		$base = realpath($cssdir);
		break;
	case 'javascript':
		$base = realpath($jsdir);
		break;
	default:
		header ("HTTP/1.0 503 Not Implemented");
		exit;
};

$type = $_GET['type'];
$elements = explode(',', $_GET['files']);

// Determine last modification date of the files
$lastmodified = 0;
while (list(,$element) = each($elements)) {
	$path = realpath($base . '/' . $element);

	if (($type == 'javascript' && substr($path, -3) != '.js') || 
		($type == 'css' && substr($path, -4) != '.css')) {
		header ("HTTP/1.0 403 Forbidden");
		exit;	
	}

	if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) {
		header ("HTTP/1.0 404 Not Found");
		exit;
	}
	
	$lastmodified = max($lastmodified, filemtime($path));
}

// Send Etag hash
$hash = $lastmodified . '-' . md5($_GET['files']);
header ("Etag: \"" . $hash . "\"");

if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
	stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"') 
{
	// Return visit and no modifications, so do not send anything
	header ("HTTP/1.0 304 Not Modified");
	header ('Content-Length: 0');
} 
else 
{
	// First time visit or files were modified
	if ($cache) 
	{
		// Determine supported compression method
		$gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
		$deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');

		// Determine used compression method
		$encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');

		// Check for buggy versions of Internet Explorer
		if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && 
			preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) {
			$version = floatval($matches[1]);
			
			if ($version < 6)
				$encoding = 'none';
				
			if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) 
				$encoding = 'none';
		}
		
		// Try the cache first to see if the combined files were already generated
		$cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '');
		
		if (file_exists($cachedir . '/' . $cachefile)) {
			if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {

				if ($encoding != 'none') {
					header ("Content-Encoding: " . $encoding);
				}
			
				header ("Content-Type: text/" . $type);
				header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));
	
				fpassthru($fp);
				fclose($fp);
				exit;
			}
		}
	}

	// Get contents of the files
	$contents = '';
	reset($elements);
	while (list(,$element) = each($elements)) {
		$path = realpath($base . '/' . $element);
		$contents .= "\n\n" . file_get_contents($path);
	}

	// Send Content-Type
	header ("Content-Type: text/" . $type);
	
	if (isset($encoding) && $encoding != 'none') 
	{
		// Send compressed contents
		$contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
		header ("Content-Encoding: " . $encoding);
		header ('Content-Length: ' . strlen($contents));
		echo $contents;
	} 
	else 
	{
		// Send regular contents
		header ('Content-Length: ' . strlen($contents));
		echo $contents;
	}

	// Store cache
	if ($cache) {
		if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
			fwrite($fp, $contents);
			fclose($fp);
		}
	}
}	
?>

<?php 

    /************************************************************************ 
     * CSS and Javascript Combinator 0.5 
     * Copyright 2006 by Niels Leenheer 
     * 
     * CSS and Javascript cacher 0.1 
     * Copyright 2008 by Kashey 
     * 
     * Permission is hereby granted, free of charge, to any person obtaining 
     * a copy of this software and associated documentation files (the 
     * "Software"), to deal in the Software without restriction, including 
     * without limitation the rights to use, copy, modify, merge, publish, 
     * distribute, sublicense, and/or sell copies of the Software, and to 
     * permit persons to whom the Software is furnished to do so, subject to 
     * the following conditions: 
     *  
     * The above copyright notice and this permission notice shall be 
     * included in all copies or substantial portions of the Software. 
     * 
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
     * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
     * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
     * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
     * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
     * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
     * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
     */ 
      
      
if(!defined("COMBINE_KEEP_ALIVE"))define("COMBINE_KEEP_ALIVE",60*60*24);      
if(!defined("COMBINE_CACHE_DIR" ))define("COMBINE_CACHE_DIR","./cache/jsmin"); 
if(!defined("HOST_CACHE_DIR" ))define("HOST_CACHE_DIR","cache/jsmin/"); 
 // lets store filemfile just for 10s 
      
    function apcfilemtime($f) 
    { 
        $t=apc_fetch($_SERVER['SERVER_NAME']."jsmin_fmt_".$f); 
        if($t)return $t; 
        $t=filemtime($f); 
        apc_store($_SERVER['SERVER_NAME']."jsmin_fmt_".$f,intval($t),10); 
        return $t; 
    } 
      
 // builds canonical name for given list of files     
   function combine_build_name($type,$files) 
   {  
    $ret=apc_fetch($_SERVER['SERVER_NAME']."_".$type.".$files"); 
    if($ret)return $ret; 

    switch ($type) { 
        case 'css': 
            $itype=1; 
            break; 
        case 'javascript': 
            $itype=2; 
            $is_js=1; 
            break; 
        default: 
            return FALSE; 
    }; 
    $base="."; 

    $elements = explode(',', $files); 
     
    // Determine last modification date of the files 
    $parsedel=array(); 
    $lastmodified = 0; 
    $lastem=''; 
    $fullnames=''; 
    while (list(,$element) = each($elements)) { 
        if($element[0]=='~') 
         $path=dirname($lastem)."/".substr($element,1);    
        else 
         $path = realpath($base . '/' . $element); 
        $fullnames.=$path.","; 
        if (file_exists($path))  
        { 
          $lastmodified = max($lastmodified, apcfilemtime($path)); 
          $lastem       =$path; 
          $parsedel[]   =$path; 
        } 
    } 
    // Send Etag hash 
    $hash = $lastmodified . '-' . md5($fullnames);     
    $ret=array("Etag"=>$hash,"time"=>$lastmodified,"files"=>$parsedel,"fullname"=>$fullnames); 
    apc_store($_SERVER['SERVER_NAME']."_".$type.".$files",$ret,60); 
    return $ret; 
   } 
   
  // casts files into archives  
   function combine_cast($type,$files) 
   { 
     $cachedir=COMBINE_CACHE_DIR;   
     $ret=combine_build_name($type,$files);   
     $MT=$ret['time']; 
     $cachefile = $cachedir . '/'.'cache-' . $ret['Etag'] . '.' . $type."."; 
     $times=array(apcfilemtime($cachefile."txt"), 
                  apcfilemtime($cachefile."gzip"), 
                  apcfilemtime($cachefile."deflate") 
                  );  
      
     if($times[0]>=$MT && 
        $times[1]>=$MT && 
        $times[2]>=$MT) return $ret['Etag']; 
     $elements=$ret['files']; 
     $contents=''; 
     reset($elements); 
     while (list(,$element) = each($elements)) { 
        $contents .= "\n//#".basename($element)."#//\n" . file_get_contents($element); 
     } 
     if($type=='javascript') 
     { 
         require_once("jsmin.php");    
         $contents=JSMin::minify($contents); 
     } 
     //here one can add css min ( like CssTidy ) 
     $contentsG = gzencode($contents, 9, FORCE_GZIP); 
     $contentsD = gzencode($contents, 9, FORCE_DEFLATE); 
      
       if ($fp = fopen( $cachefile."txt", 'wb+'))  
     {fwrite($fp, $contents);fclose($fp);}else echo "unable to save ".$cachefile."txt"; 
     if ($fp = fopen( $cachefile."gzip", 'wb+'))  
     {fwrite($fp, $contentsG);fclose($fp);}else echo "unable to save ".$cachefile."gzip"; 
     if ($fp = fopen( $cachefile."deflate", 'wb+'))  
     {fwrite($fp, $contentsD);fclose($fp);}else echo "unable to save ".$cachefile."deflate";      
      
     return $ret['Etag']; 
   } 
   
  //output cached file  
   function combine_send_file($type,$files) 
   { 
    $hash=combine_cast($type,$files); 
    combine_fetch($type,$hash); 
   } 
    
  //make ref to drived file 
   function combine_makeref($type,$files) 
   { 
    $hash=combine_cast($type,$files); 
    if($type=='javascript')$type='js'; 
    return $hash.".".$type."f"; 
   } 
    
  //make static ref to file  
   function combine_staticref($type,$files) 
   { 
       $hash=combine_cast($type,$files); 
       if($type=='javascript')$type='js'; 
       return HOST_CACHE_DIR.$hash.".".$type.combine_is_gzip_suported(); 
   } 
   
  //determine is gzip(or deflate) supported  
   function combine_is_gzip_suported() 
   { 
        $encoding=apc_fetch($_SERVER['HTTP_ACCEPT_ENCODING']."_".$_SERVER['HTTP_USER_AGENT']); 
        if($encoding)return $encoding; 

        $gzip    = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'); 
        $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate'); 
        // Determine used compression method 
        $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none'); 
        // Check for buggy versions of Internet Explorer 
        if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') &&  
             preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) 
        { 
            $version = floatval($matches[1]); 
            if ($version < 6)$encoding = 'none'; 
            if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) $encoding = 'none'; 
        } 
        apc_store($_SERVER['HTTP_ACCEPT_ENCODING']."_".$_SERVER['HTTP_USER_AGENT'],"".$encoding,60);    
        return $encoding; 
   } 
   
  //output file  
   function combine_fetch($type,$hash) 
   {    
    $cachedir=COMBINE_CACHE_DIR;   
    header("Expires: " . gmdate("D, d M Y H:i:s",time()+COMBINE_KEEP_ALIVE) . " GMT");  
    header ("Etag: \"" . $hash . "\"");   
    $encoding=combine_is_gzip_suported(); 
    $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '.txt'); 
     
    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"')  
    { 
        // Return visit and no modifications, so do not send anything 
        header ("HTTP/1.0 304 Not Modified"); 
        header ('Content-Length: 0'); 
        exit; 
    }  
    else  
    { 
         $fmt=apcfilemtime($cachedir . '/' . $cachefile); 
         if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) 
         { 
             if($_SERVER['HTTP_IF_MODIFIED_SINCE']==gmdate("D, d M Y H:i:s",$fmt)." GMT") 
             { 
                 header('HTTP/1.1 304 Not Modified'); 
                 exit();  
             } 
         } 

            header("Last-Modified: " . gmdate("D, d M Y H:i:s",$fmt) . " GMT"); 
            $datacache=apc_fetch($_SERVER['SERVER_NAME']."jsmin_".$cachefile); 
            if($datacache) 
            { 
                    if ($encoding != 'none') 
                        header ("Content-Encoding: " . $encoding); 
                    header ("Content-Type: text/" . $type); 
                    header ("Content-Length: " . apc_fetch($_SERVER['SERVER_NAME']."jsmin_s_".$cachefile)); 
                    echo $datacache; 
                    exit; 
            } 
                if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) { 
                    if ($encoding != 'none') { 
                        header ("Content-Encoding: " . $encoding); 
                    } 
                    $FS=filesize($cachedir . '/' . $cachefile); 
                    $contents=file_get_contents($cachedir . '/' . $cachefile); 
                    apc_store($_SERVER['SERVER_NAME']."jsmin_".$cachefile,$contents."",60); 
                    apc_store($_SERVER['SERVER_NAME']."jsmin_s_".$cachefile,intval($FS),60); 
                    header ("Attach-Name:$cachefile"); 
                    header ("Content-Type: text/" . $type); 
                    header ("Content-Length: " . $FS); 
                    echo $contents; 
                    fclose($fp); 
                    exit; 
                }else echo "404 and so on".$cachedir . '/' . $cachefile; 
             
        } 
       
       
       
   }     
?>